package com.ck.company.service;

import com.ck.constant.DeviceSettingType;
import com.ck.exception.ServiceException;
import com.ck.model.common.DeviceSetting;
import com.ck.model.common.User;
import com.ck.model.company.vo.*;
import com.github.pagehelper.Page;

import java.util.List;

/**
 * <p>Title: CpDeviceInfoService</p>
 * <p>Description: 商家终端信息service</p>
 *
 * @author huangf
 * @date 2018年6月22日
 */
public interface CpDeviceInfoService {

    /**
     * 分页查询某个商家的终端终端信息列表
     *
     * @param companyCode  商家代码
     * @param groupId      分组ID
     * @param deviceNum    机器码
     * @param deviceIp     终端IP
     * @param deviceMac    终端mac
     * @param deviceName   终端名称
     * @param deviceStatus 终端状态
     * @param pageNum      当前页
     * @param pageSize     每页条数
     * @return Page<CpDeviceInfoListVO>
     */
    Page<CpDeviceInfoListVO> listByPage(String companyCode, Long groupId, String deviceNum, String deviceIp, String deviceMac,
                                        String deviceName, Integer deviceStatus, Integer pageNum, Integer pageSize);

    /**
     * 无条件查询某个商家的所有在线终端数量
     *
     * @param companyCode 商家编码
     * @return Long
     */
    Long getOnlineDeviceInfoCount(String companyCode);

    /**
     * 无条件查询某个商家的所有离线终端数量
     *
     * @param companyCode 商家编码
     * @return Long
     */
    Long getOfflineDeviceInfoCount(String companyCode);

    /**
     * 某个商家将分组ID置为空
     *
     * @param companyCode 商家编码
     * @param groupId     分组ID
     */
    void updateDeviceGroupNull(String companyCode, Long groupId);

    /**
     * 根据商家编号/分组ids，获取对应的所有deviceCode
     *
     * @param companyCode 商家编码
     * @param groupIds    分组ID集合
     * @return List<String>
     */
    List<String> listAllDeviceCode(String companyCode, List<String> groupIds);

    /**
     * 远程关机指令
     *
     * @param deviceCodes 终端序列号(多个英文逗号隔开)
     * @param groupIds    分组ID(多个英文逗号隔开)
     * @param user        登录用户
     * @param ip          用户IP
     * @throws ServiceException
     */
    void shutdown(String deviceCodes, String groupIds, User user, String ip) throws ServiceException;

    /**
     * 远程重启终端
     *
     * @param deviceCodes 终端序列号(多个英文逗号隔开)
     * @param groupIds    分组ID(多个英文逗号隔开)
     * @param user        登录用户
     * @param ip          用户IP
     * @throws ServiceException
     */
    void restart(String deviceCodes, String groupIds, User user, String ip) throws ServiceException;

    /**
     * 设置定时开关机
     *
     * @param deviceCodes 终端序列号(多个英文逗号隔开)
     * @param groupIds    分组ID(多个英文逗号隔开)
     * @param user        登录用户
     * @param ip          用户IP
     * @param bootTime    开机时间
     * @param offTime     关机时间
     * @throws ServiceException
     */
    void setBootAndOffTimmer(String deviceCodes, String groupIds, User user, String ip, String bootTime, String offTime) throws ServiceException;

    /**
     * 设置定时开关屏
     *
     * @param deviceCodes 终端序列号(多个英文逗号隔开)
     * @param groupIds    分组ID(多个英文逗号隔开)
     * @param user        登录用户
     * @param ip          用户IP
     * @param bootTime    开屏时间
     * @param offTime     关屏时间
     * @throws ServiceException
     */
    void setScreenOnAndOffTimmer(String deviceCodes, String groupIds, User user, String ip, String bootTime, String offTime) throws ServiceException;

    /**
     * 设置音量
     *
     * @param deviceCodes 终端序列号(多个英文逗号隔开)
     * @param groupIds    分组ID(多个英文逗号隔开)
     * @param user        登录用户
     * @param ip          用户IP
     * @param vol         音量（0~100）
     * @throws ServiceException
     */
    void setVolume(String deviceCodes, String groupIds, User user, String ip, Integer vol) throws ServiceException;

    /**
     * 根据终端mac或者机器码查询终端详情
     *
     * @param companyCode 商家code
     * @param deviceMac   终端mac
     * @param deviceCode  终端机器码
     * @return CpDeviceDetailVO
     */
    CpDeviceDetailVO getDeviceDetailByDeviceMacOrDeviceCode(String companyCode, String deviceMac, String deviceCode);

    /**
     * 节目投放选择终端列表分页
     *
     * @param companyCode      商家编号
     * @param deviceCode       终端机器码
     * @param deviceGroupIdArr 分组ID
     * @param province         省
     * @param city             市
     * @param area             区
     * @param startTimeL       投放开始时间
     * @param endTimeL         投放结束时间
     * @param putinLevel       投放级别（1普通，2插播）
     * @param pageNum          当前页
     * @param pageSize         每页条数
     * @return Page<CpProgramPutinDeviceListVO>
     */
    Page<CpProgramPutinDeviceListVO> listProgramPutinDeviceByPage(String companyCode, String deviceCode,
                                                                  String[] deviceGroupIdArr, String province,
                                                                  String city, String area,
                                                                  Long startTimeL, Long endTimeL, Integer putinLevel,
                                                                  Integer pageNum, Integer pageSize);


    /**
     * 节目投放选择终端列表分页
     *
     * @param companyCode   商家编号
     * @param deviceCode    终端机器码
     * @param deviceGroupId 分组ID
     * @param province      省
     * @param city          市
     * @param area          区
     * @param startTimeL    投放开始时间
     * @param endTimeL      投放结束时间
     * @param putinLevel    投放级别（1普通，2插播）
     * @param pageNum       当前页
     * @param pageSize      每页条数
     * @return Page<CpProgramPutinDeviceListVO>
     */
    Page<CpProgramPutinDeviceListVO> listProgramPutinDeviceBySingleGroupByPage(String companyCode, String deviceCode,
                                                                               Long deviceGroupId, String province,
                                                                               String city, String area,
                                                                               Long startTimeL, Long endTimeL, Integer putinLevel,
                                                                               Integer pageNum, Integer pageSize);

    /**
     * 查询终端code和商家是否 匹配
     *
     * @param deviceCode  终端序列号
     * @param companyCode 商家编码
     * @return 匹配返回true，反之false
     */
    boolean deviceMatchCompany(String deviceCode, String companyCode);

    /**
     * 终端设置信息同步到数据库
     *
     * @param setting     设置信息
     * @param deviceCodes 终端序列号集合
     * @param companyCode 商家编码
     */
    void updateDeviceSetting(DeviceSetting setting, List<String> deviceCodes, String companyCode);

    /**
     * 更新终端基础信息
     *
     * @param deviceCode  code
     * @param deviceName  终端名（备注）
     * @param companyCode 商家编码
     * @param province    省
     * @param city        市
     * @param area        地区
     * @param detailAddr  详细地址
     */
    void updateDeviceBasicInfo(String deviceCode, String deviceName, String companyCode, String province, String city, String area, String detailAddr);

    /**
     * 将终端最新状态或设置更新到缓存
     *
     * @param companyCode 商家编码
     * @param settingType 设置类型
     * @param codes       终端code集合
     * @param serialNo    批次号，唯一且有意义。（如：时间戳）
     */
    void flushDeviceStateCache(String companyCode, DeviceSettingType settingType, List<String> codes, Long serialNo);

    /**
     * 全部终端分页列表
     *
     * @param startTime   开始时间
     * @param endTime     结束时间
     * @param province    省份
     * @param city        城市
     * @param area        区/县
     * @param deviceCode  机器码
     * @param deviceMac   终端MAC
     * @param deviceGroup 所属分组
     * @param companyCode 商家代码
     * @param pageNum     当前页数
     * @param pageSize    每页条数
     * @return Page<CpAllDeviceVO>
     */
    Page<CpAllDeviceVO> allDeviceReport(String startTime, String endTime, String province, String city, String area, String deviceCode, String deviceMac, String deviceGroup, String companyCode, Integer pageNum, Integer pageSize);

    /**
     * 导出全部终端列表
     *
     * @param startTime   开始时间
     * @param endTime     结束时间
     * @param province    省份
     * @param city        城市
     * @param area        区/县
     * @param deviceCode  机器码
     * @param deviceMac   终端MAC
     * @param deviceGroup 所属分组
     * @param companyCode 商家代码
     * @return List<CpAllDeviceVO>
     */
    List<CpAllDeviceVO> allDeviceListExport(String companyCode, String startTime, String endTime, String province, String city, String area, String deviceCode, String deviceMac, String deviceGroup);

    /**
     * 根据商家编码和节目版本号查询终端code集合
     *
     * @param companyCode 商家编码
     * @param versionList 版本号集合
     * @return 终端code集合
     */
    List<String> listDeviceCodeByCompanyCodeAndProgramVersion(String companyCode, List<String> versionList);

    /**
     * 单个终端分页列表
     *
     * @param startTime   开始时间
     * @param endTime     结束时间
     * @param deviceCode  机器码
     * @param deviceMac   终端MAC
     * @param pageNum     当前页数
     * @param pageSize    每页条数
     * @param companyCode 商家代码
     * @return Page<CpSingleDeviceVO>
     */
    Page<CpSingleDeviceVO> singleDeviceReport(String startTime, String endTime, String deviceCode, String deviceMac, String companyCode, Integer pageNum, Integer pageSize);


    /**
     * 导出单个终端列表
     *
     * @param companyCode 商家代码
     * @param startTime   开始时间
     * @param endTime     结束时间
     * @param deviceCode  机器码
     * @param deviceMac   终端MAC
     * @return
     */
    List<CpSingleDeviceVO> singleDeviceListExport(String companyCode, String startTime, String endTime, String deviceCode, String deviceMac);

    /**
     * 如果设备长时间不在线，更新终端为离线状态，返回更新条数
     *
     * @return int
     */
    int setDeviceOffLine();

    /**
     * 解绑终端
     *
     * @param companyCode 商家编码
     * @param deviceCodes 终端序列号（多个英文逗号隔开）
     * @param user        登录用户
     * @param ip          登录用户IP
     */
    void untie(String companyCode, String deviceCodes, User user, String ip);
}
